#include <iostream>
#include <time.h>

#include "Collision.hpp"
#include "HashFunction.hpp"

using namespace std;

int main(int argc, char** argv)
{
	string SignedText   = "Hiermit bestaetige ich der Uebungsgruppe 99, dass die Teilnehmer unregelmaessig und hochgradig unmotiviert erschienen sind.";
	string ModifiedText = "Hiermit bestaetige ich der Uebungsgruppe 99, dass deren Teilnehmer den Schein zur Vorlesung NetSec mit 1.0 bestanden haben.";

	cout << "##### Crack Signature ##### \n";
	cout << "Suche.. \n";

	time_t startzeit;
	time(&startzeit);

	string a1 = "";
	string a2 = Collision::crackSignatureSerial(SignedText, ModifiedText, 3);

	time_t endzeit;
	time(&endzeit);

	std::cout << "Hash-Kollision gefunden! \n";
	std::cout << "Signed Text   : " << SignedText + a1 << "\n";
	std::cout << "Modified Text : " << ModifiedText + a2 << "\n";
	std::cout << "Signed Hash   : " << HashFunction::calculateHash(16, SignedText + a1).toHex(false) << "\n";
	std::cout << "Modified Hash : " << HashFunction::calculateHash(16, ModifiedText + a2).toHex(false) << "\n";
	std::cout << "Benötigte Zeit: " << difftime( endzeit, startzeit ) << " Sekunden \n";
	
	cout << "##### Crack Signature with Birthday##### \n";
	cout << "Suche.. \n";

	time(&startzeit);

	pair<string ,string > myp = Collision::crackSignatureBirthday(SignedText, ModifiedText, 5);

	time(&endzeit);

	std::cout << "Hash-Kollision gefunden! \n";
	std::cout << "Signed Text   : " << SignedText + myp.first << "\n";
	std::cout << "Modified Text : " << ModifiedText + myp.second << "\n";
	std::cout << "Signed Hash   : " << HashFunction::calculateHash(16, SignedText + myp.first).toHex(false) << "\n";
	std::cout << "Modified Hash : " << HashFunction::calculateHash(16, ModifiedText + myp.second).toHex(false) << "\n";
	std::cout << "Benötigte Zeit: " << difftime( endzeit, startzeit ) << " Sekunden \n";
}

